package com.sky.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sky.exception.OrderBusinessException;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashMap;
import java.util.Map;

public class CheckOutOfRangeUtils {
    /**
     * 用@value注解注入配置文件中的百度地图服务ak和店铺地址
     * 调用百度地图API进行配送距离校验
     */
    @Value("${sky.shop.address}")
    private static String shopAddress;

    @Value("${sky.baidu.ak}")
    private static String ak;



    /**
     * 检查客户的收货地址是否超出配送范围
     *
     * @param address
     * @param s
     */
    public static void checkOutOfRange(String address) {
        //创建访问百度地图API的请求参数
        Map map = new HashMap();
        map.put("address",shopAddress);//商店地址
        map.put("output","json");//输出格式
        map.put("ak",ak);//百度地图服务ak

        /*获取店铺的经纬度坐标*/
        //发送get请求,携带请求参数为map中的数据
        String shopCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        JSONObject jsonObject = JSON.parseObject(shopCoordinate);//把响应结果json字符串转换为json对象

        //判断是否解析成功
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("店铺地址解析失败");
        }

        //数据解析
        JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
        //获取json对象result下的location下的lat和lng(纬度和经度)
        String lat = location.getString("lat");
        String lng = location.getString("lng");
        //店铺经纬度坐标
        String shopLngLat = lat + "," + lng;

        map.put("address",address);//把地址设置为用户收货地址
        /*获取用户收货地址的经纬度坐标*/
        String userCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        jsonObject = JSON.parseObject(userCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("收货地址解析失败");
        }

        //数据解析
        location = jsonObject.getJSONObject("result").getJSONObject("location");
        lat = location.getString("lat");
        lng = location.getString("lng");
        //用户收货地址经纬度坐标
        String userLngLat = lat + "," + lng;

        map.put("origin",shopLngLat);//设置地址源为店铺经纬度坐标
        map.put("destination",userLngLat);//设置目的地址为用户收货地址经纬度坐标
        map.put("steps_info","0");//不返回路线上的节点信息

        //根据商店和用户的经纬度坐标,获取配送路线规划
        String json = HttpClientUtil.doGet("https://api.map.baidu.com/directionlite/v1/driving", map);

        jsonObject = JSON.parseObject(json);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("配送路线规划失败");
        }

        //数据解析,获取配送距离
        JSONObject result = jsonObject.getJSONObject("result");
        JSONArray jsonArray = (JSONArray) result.get("routes");
        Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance");//获取路径距离,转换为Integer类型

        //校验配送距离是否超出范围,超过5000米则抛出异常
        if(distance > 5000){
            //配送距离超过5000米
            throw new OrderBusinessException("超出配送范围");
        }
    }
}
